package generator.datastructure.j2xml_impl;

import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import generator.datastructure.WritebleClass;
import generator.util.DocTransformer;
import generator.util.J2XMLManipulator;

import org.w3c.dom.Document;

/**
 * Esta clase envuelve a la clase Document de modo de implementar los métodos de la interface
 * WritableClass.
 * @author Hirsch-Fernández
 * 
 */
public class DocumentWrapper implements WritebleClass {
	
	/**Hoja de estilo utilizada para realizar el flush del documento a un archivo fuente de java*/
	private String styleSheet = "config"+System.getProperty("file.separator")+"JavaToXml"+System.getProperty("file.separator")+"javaxml-to-plain-source.xsl";
	
	/**Clase java representada bajo la forma de árbol DOM*/
	private Document doc;	
	
	/**Constructor de la clase 
	 * @param Documento que será envuelto por la clase {@link DocumentWrapper}*/
	public DocumentWrapper(Document doc){
		this.doc = doc;	
	}
	
	/**Permite setear la hoja de estilo que se utilizará en la implementación del método export
	 */
	public void setStyleSheet(String styleSheet){
		this.styleSheet = styleSheet;		
	}

	/**
	 * {@inheritDoc}
	 */
	public String export(String destDirectory){
		try {
			String className = (String)XPathFactory.newInstance().newXPath().evaluate("//java-class-file/@name", doc, XPathConstants.STRING);
			DocTransformer.domToJavaSource(doc, destDirectory+className, styleSheet);
			return destDirectory+className;
		} catch (Exception e) {
			System.err.println("Falló volcado de documento a clase java");
			e.printStackTrace();			
			return "";
		}
	}
	
	/**
	 * @return el documento que representa la clase java al cual envuelve {@link DocumentWrapper}*/
	public Document getDocument(){
		return doc;
	}

	@Override
	public String getName() {
		return J2XMLManipulator.getClassName(doc);
		
	}
}
